// 版权所有2009-2010 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

/*
	Floating-point mod function.
*/

// Mod返回x/y的浮点余数。
// 结果的大小小于y，其
// 符号与x的符号一致。
// 
// 特殊情况为：
// Mod（±Inf，y）=NaN 
// Mod（NaN，y）=NaN 
// Mod（x，0）=NaN 
// Mod x，±Inf）=x 
// Mod（x，NaN）=NaN 
func Mod(x, y float64) float64 {
	if haveArchMod {
		return archMod(x, y)
	}
	return mod(x, y)
}

func mod(x, y float64) float64 {
	if y == 0 || IsInf(x, 0) || IsNaN(x) || IsNaN(y) {
		return NaN()
	}
	y = Abs(y)

	yfr, yexp := Frexp(y)
	r := x
	if x < 0 {
		r = -x
	}

	for r >= y {
		rfr, rexp := Frexp(r)
		if rfr < yfr {
			rexp = rexp - 1
		}
		r = r - Ldexp(y, rexp-yexp)
	}
	if x < 0 {
		r = -r
	}
	return r
}
